package com.xcm.service;

import java.rmi.ServerException;
import java.util.List;

import org.apache.ibatis.annotations.Param;

import com.github.pagehelper.Page;
import com.xcm.model.TbDeviceInfo;
import com.xcm.model.dto.ApkDeviceListDTO;
import com.xcm.model.dto.DeviceInfoListDTO;
import com.xcm.model.vo.SingleDeviceReportVO;
import com.xcm.page.PageInfo;

public interface DeviceInfoService {
	/**
	 * 保存终端
	 *
	 * @param deviceInfo TbDeviceInfo类型对象
	 */
	void saveDeviceInfo(TbDeviceInfo deviceInfo);

	/**
	 * 通过mac获取终端
	 *
	 * @param deviceMac 终端Mac
	 * @return TbDeviceInfo
	 */
	TbDeviceInfo getDeviceInfoByMac(String deviceMac);

	/**
	 * 更新终端
	 *
	 * @param deviceInfo    TbDeviceInfo类型对象
	 * @param oldDeviceInfo TbDeviceInfo类型对象
	 */
	void updateDeviceInfo(TbDeviceInfo deviceInfo, TbDeviceInfo oldDeviceInfo);

	/**
	 * 终端分页列表
	 *
	 * @param groupCode
	 * @param deviceNum    终端机器码
	 * @param deviceIp     终端IP
	 * @param deviceMac    终端Mac
	 * @param deviceStatus 终端状态
	 * @param pageNum      当前页
	 * @param pageSize     每页条数
	 * @return Page<DeviceInfoListDTO>
	 */
	Page<DeviceInfoListDTO> listByPage(String groupCode, String deviceNum, String deviceIp, String deviceMac, Integer deviceStatus, Integer pageNum, Integer pageSize);

	/**
	 * 修改终端机器码
	 *
	 * @param deviceInfoId 终端ID
	 * @param deviceNum    终端机器码
	 * @param deviceMac    终端Mac地址
	 */
	void updateDeviceNum(Long deviceInfoId, String deviceNum, String deviceMac);

	/**
	 * 关机
	 *
	 * @param deviceMacs 终端Mac地址
	 * @param groupCode  分组码
	 */
	void shutdown(String deviceMacs, String groupCode);

	/**
	 * 获取所有终端Mac地址
	 *
	 * @return List<String>
	 */
	List<String> listAllDeviceMac();

	/**
	 * 重启
	 *
	 * @param deviceMacs 终端Mac地址
	 * @param groupCode  分组码
	 */
	void restart(String deviceMacs, String groupCode);

	/**
	 * 指定终端升级
	 *
	 * @param deviceInfoId    终端ID
	 * @param deviceUpgradeId 终端升级ID
	 */
	void updateDeviceUpdate(Long deviceInfoId, Long deviceUpgradeId);

	/**
	 * 通过终端id获取终端
	 *
	 * @param deviceInfoId 终端id
	 * @return TbDeviceInfo
	 */
	TbDeviceInfo getDeviceInfoById(Long deviceInfoId);

	/**
	 * 设置定时开关机
	 *
	 * @param deviceMacs 终端Mac地址
	 * @param groupCode  分组码
	 * @param useTimer   (1:启用 0:关闭)
	 * @param bootTime   开机时间
	 * @param offTime    关机时间
	 */
	void updateDeviceBootOffTime(String deviceMacs, String groupCode, Integer useTimer, Long bootTime, Long offTime);

	/**
	 * 设置音量
	 *
	 * @param deviceMacs   终端Macs地址
	 * @param groupCode    分组码
	 * @param deviceVolume 音量
	 */
	void updateDeviceVolume(String deviceMacs, String groupCode, Integer deviceVolume);

	/**
	 * 通过终端MAC修改机器码
	 *
	 * @param deviceMac 终端mac地址
	 * @param deviceNum 机器码
	 */
	void updateDeviceNumByDeviceMac(String deviceMac, String deviceNum);

	/**
	 * 通过终端MAC设置音量
	 *
	 * @param deviceMac    终端Macs地址
	 * @param deviceVolume 音量
	 */
	void updateDeviceVolumeByDeviceMac(String deviceMac, Integer deviceVolume);

	/**
	 * 通过mac地址设置定时开关机
	 *
	 * @param deviceMac 终端Mac地址
	 * @param useTimer  (1:启用 0:关闭)
	 * @param bootTime  开机时间
	 * @param offTime   关机时间
	 */
	void updateDeviceBootOffTimeByMac(String deviceMac, Integer useTimer, Long bootTime, Long offTime);

	/**
	 * 获取分组码所属的终端Mac地址
	 *
	 * @param groupCode 分组码
	 * @return List<String>
	 */
	List<String> listDeviceMac(String groupCode);

	/**
	 * 上传日志（云端发指令通知终端上传日志）
	 *
	 * @param mac mac地址
	 */
	void uploadLog(String mac);

	/**
	 * 获取在线终端数
	 *
	 * @return Long
	 */
	Long getOnlineDeviceInfoCount();

	/**
	 * 获取离线终端数
	 *
	 * @return Long
	 */
	Long getOfflineDeviceInfoCount();

	/**
	 * 通过机器编码获取在线终端数量
	 *
	 * @param deviceNum
	 * @return
	 */
	Long getOnlineDeviceInfoCountbyDeviceNum(String deviceNum);

	/**
	 * 通过机器编码获取离线终端数量
	 *
	 * @param deviceNum
	 * @return
	 */
	Long getOfflineDeviceInfoCountbyDeviceNum(String deviceNum);

	/**
	 * 通过IP地址获取在线终端数量
	 *
	 * @param deviceIp
	 * @return
	 */
	Long getOnlineDeviceInfoCountbyDeviceIp(String deviceIp);

	/**
	 * 通过IP地址获取离线终端数量
	 *
	 * @param deviceIp
	 * @return
	 */
	Long getOfflineDeviceInfoCountbyDeviceIp(String deviceIp);

	/**
	 * 通过MAC地址获取在线终端数量
	 *
	 * @param deviceMac
	 * @return
	 */
	Long getOnlineDeviceInfoCountbyDeviceMac(String deviceMac);

	/**
	 * 通过MAC地址获取离线终端数量
	 *
	 * @param deviceMac
	 * @return
	 */
	Long getOfflineDeviceInfoCountbyDeviceMac(String deviceMac);

	/**
	 * 通过分组编码获取在线终端数量
	 *
	 * @param groupCode
	 * @return
	 */
	Long getOnlineDeviceInfoCountbyGroupCode(String groupCode);

	/**
	 * 通过分组编码获取离线终端数量
	 *
	 * @param groupCode
	 * @return
	 */
	Long getOfflineDeviceInfoCountbyGroupCode(String groupCode);

	/**
	 * 获取终端信息
	 *
	 * @param mipsVersion  mips版本
	 * @param deviceStatus 终端状态
	 * @param model        机型
	 * @param province     省
	 * @param city         市
	 * @param county       区
	 * @param groupCode    分组码
	 * @param pageNum      当期页
	 * @param pageSize     每页条数
	 * @return PageInfo<ApkDeviceListDTO>
	 */
	PageInfo<ApkDeviceListDTO> listApkDeviceByPage(String mipsVersion, Integer deviceStatus, String model, String province,
	                                               String city, String county, String groupCode, Integer pageNum, Integer pageSize);

	/**
	 * 获取在线终端数
	 *
	 * @param mipsVersion mips版本
	 * @param model       机型
	 * @param province    省
	 * @param city        市
	 * @param county      区
	 * @param groupCode   分组码
	 * @return Long
	 */
	Long getApkDeviceOnlineCount(String mipsVersion, String model, String province, String city, String county, String groupCode);

	/**
	 * 获取离线终端数
	 *
	 * @param mipsVersion mips版本
	 * @param model       机型
	 * @param province    省
	 * @param city        市
	 * @param county      区
	 * @param groupCode   分组码
	 * @return Long
	 */
	Long getApkDeviceOfflineCount(String mipsVersion, String model, String province, String city, String county, String groupCode);

	/**
	 * 通过终端升级ids更新软件升级ID
	 * @param deviceInfoIds 终端ID字符串集合("1,2,3,4")
	 * @param softwareUpgradeId   软件升级ID
	 */
	void updateSoftwareUpgradeIdByDeviceInfoIds(@Param("deviceInfoIds") String deviceInfoIds, @Param("") Long softwareUpgradeId) throws ServerException;
	
	/**
	 * 获取单个终端的报表信息-分页
	 * @param startTime 时间点-开始
	 * @param endTime 时间点-结束
	 * @param deviceNum 机器码
	 * @param mac mac地址
	 * @param pageNum 
	 * @param pageSize
	 * @return
	 */
	Page<SingleDeviceReportVO> listSingleDeviceReport(String startTime, String endTime, String deviceNum, String mac,Integer pageNum, Integer pageSize);
	
	/**
	 * 获取单个终端的报表信息-不分页
	 * @param startTime 时间点-开始
	 * @param endTime 时间点-结束
	 * @param deviceNum 机器码
	 * @param mac mac地址
	 * @return
	 */
	List<SingleDeviceReportVO> listExportSingleDeviceDetailReport(String startTime, String endTime, String deviceNum,String mac);

}
